/**
 * 执行网络请求并返回 JSON 数据
 * @param input 请求的 URL 或者 Request 对象
 * @param init 请求的配置选项
 * @returns Promise，解析为 JSON 格式的响应数据
 */
export async function fetcher<JSON = any>(input: RequestInfo, init?: RequestInit): Promise<JSON> {
    const response = await fetch(input, { ...init, cache: 'no-store' });
    return response.json();
}

/**
 * 将字符串首字母大写
 * @param s 输入的字符串
 * @returns 首字母大写后的字符串
 */
export const capitalize = (s: string) => {
    if (typeof s !== 'string') return '';
    return s.charAt(0).toUpperCase() + s.slice(1);
};

/**
 * 截断字符串，保留指定长度，并在末尾添加省略号
 * @param str 要截断的字符串
 * @param num 截断后字符串的最大长度
 * @returns 截断后的字符串
 */
export const truncate = (str: string, num: number) => {
    if (!str) return '';
    if (str.length <= num) {
        return str;
    }
    return str.slice(0, num) + '...';
};

/**
 * 获取模糊化数据 URL
 * @param url 图像 URL
 * @returns 模糊化数据 URL
 */
export const getBlurDataURL = async (url: string | null) => {
    if (!url) {
        return '';
    }
    try {
        const response = await fetch(`https://wsrv.nl/?url=${url}&w=50&h=50&blur=5`);
        const buffer = await response.arrayBuffer();
        const base64 = Buffer.from(buffer).toString('base64');

        return `data:image/png;base64,${base64}`;
    } catch (error) {
        return '';
    }
};

/**
 * 占位符 Blurhash 编码字符串
 */
export const placeholderBlurhash =
    '';

/**
 * 将指定的本地时间格式化为字符串
 * @param date 要格式化的时间，如果未提供，默认为当前时间
 * @returns 格式化后的时间字符串
 */
export const toDateString = (date: Date = new Date()) => {
    return new Date(date).toLocaleDateString('zh-CN', {
        year: 'numeric',
        month: 'short',
        day: 'numeric',
        hour: 'numeric',
        minute: 'numeric',
        second: 'numeric',
    });
};

/**
 * 生成指定范围内的随机整数
 * @param min 最小值（包含）
 * @param max 最大值（包含）
 * @returns 指定范围内的随机整数
 */
export const random = (min: number, max: number) => {
    return Math.floor(Math.random() * (max - min + 1) + min);
};
